NeoVM 指令集
内置数据类型
NeoVM 内置的数据类型如下表所示
| 类型 | 描述 |
|---|---|
| Array | 数组,实现为一个 List<StackItem> , StackItem 是一个抽象类,NeoVM内置的数据类型均继承自 StackItem 。 |
| Boolean | 布尔类型,实现为一个bool值和两个字节数组 TRUE 和 FALSE 。 |
| Buffer | 只读字节数组,实现为一个缓存数组 byte[] 。 |
| ByteString | 只读字节数组,实现为一个 ReadOnlyMemory<byte> 。 |
| Integer | 整型,实现为一个 BigInteger 值。 |
| InteropInterface | 互操作接口 |
| Map | 实现为一个键值对为 StackItem 的字典类型 Dictionary<PrimitiveType, StackItem> 。 |
| Null | Null类型 |
| Pointer | 指针类型,实现为一个上下文脚本 Script 和一个指令位置 Position |
| Struct | 结构体,继承自 Array 。结构与 Array 相同,只是添加了 Clone 方法和重写了 Equals 方法。 |
-
CompoundType:复合类型,包括Array、Map和Struct。 -
PrimitiveType:基本类型,包括Boolean、ByteString和Integer。
// boolean 类型
private static readonly byte[] TRUE = { 1 };
private static readonly byte[] FALSE = { 0 };
private bool value;
指令集
NeoVM虚拟机一共实现了189个指令,类别如下
| 常数 | 流程控制 | 栈操作 | 槽操作 | 字符串操作 | 逻辑运算 | 算术运算 | 高级数据结构 | 类型操作 |
|---|---|---|---|---|---|---|---|---|
| 29 | 37 | 15 | 50 | 6 | 6 | 25 | 18 | 3 |
下面将分别介绍各个指令的详细内容。
常数
常数部分指令主要完成向计算栈中压入常数或者数组的功能。
PUSHINT
| 指令 | PUSHINT8, PUSHINT16, PUSHINT32, PUSHINT64, PUSHINT128, PUSHINT256 |
|---|---|
| 字节码 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 |
| 系统费 | 1 Datoshi, 1 Datoshi, 1 Datoshi, 1 Datoshi, 4 Datoshi, 4 Datoshi |
| 功能 | 向计算栈中压入一个整数,其位长度由本指令后的 8\16\32\64\128\256指定。 |
PUSHT/PUSHF
| 指令 | PUSHT, PUSHF |
|---|---|
| 字节码 | 0x08, 0x09 |
| 系统费 | 1 Datoshi |
| 功能 | 向计算栈压入True/False |
PUSHA
| 指令 | PUSHA |
|---|---|
| 字节码 | 0x0A |
| 系统费 | 4 Datoshi |
| 功能 | 将接下来的四个字节转换为地址,并将该地址压入计算栈。 |
PUSHNULL
| 指令 | PUSHNULL |
|---|---|
| 字节码 | 0x0B |
| 系统费 | 1 Datoshi |
| 功能 | 向计算栈中压入NULL值。 |
PUSHDATA
| 指令 | PUSHDATA1, PUSHDATA2, PUSHDATA4 |
|---|---|
| 字节码 | 0x0C, 0x0D, 0x0E |
| 系统费 | 8 Datoshi, 512 Datoshi, 4096 Datoshi |
| 功能 | 向计算栈中压入一个字节数组,其长度由本指令后的 1|2|4 字节指定。 |
PUSHM1
| 指令 | PUSHM1 |
|---|---|
| 字节码 | 0x0F |
| 系统费 | 1 Datoshi |
| 功能 | 向计算栈中压入一个整数,其数值等于-1。 |
PUSHN
| 指令 | PUSH0~PUSH16 |
|---|---|
| 字节码 | 0x10~0x20 |
| 系统费 | 1 Datoshi |
| 功能 | 向计算栈中压入一个整数,其数值等于0~16。 |
流程控制
用于控制的虚拟机运行流程,包括跳转、调用等指令。
NOP
| 指令 | NOP |
|---|---|
| 字节码 | 0x21 |
| 系统费 | 1 Datoshi |
| 功能 | 空操作,但是会使指令计步器加1。 |
JMP
| 指令 | JMP |
|---|---|
| 字节码 | 0x22 |
| 系统费 | 2 Datoshi |
| 功能 | 无条件跳转到指定偏移位置,偏移量由本指令后的1字节指定。 |
JMP_L
| 指令 | JMP_L |
|---|---|
| 字节码 | 0x23 |
| 系统费 | 2 Datoshi |
| 功能 | 无条件跳转到指定偏移位置。偏移量由本指令后的4字节指定。 |
JMPIF
| 指令 | JMPIF |
|---|---|
| 字节码 | 0x24 |
| 系统费 | 2 Datoshi |
| 功能 | 当计算栈栈顶元素为true,而不等于0或null时,跳转到指定偏移位置,偏移量由本指令后的1字节指定。 |
JMPIF_L
| 指令 | JMPIF_L |
|---|---|
| 字节码 | 0x25 |
| 系统费 | 2 Datoshi |
| 功能 | 当计算栈栈顶元素为true,而不等于0或null时,跳转到指定偏移位置,偏移量由本指令后的4字节指定。 |
JMPIFNOT
| 指令 | JMPIFNOT |
|---|---|
| 字节码 | 0x26 |
| 系统费 | 2 Datoshi |
| 功能 | 当计算栈栈顶元素为false、0或者null时,跳转到指定偏移位置,偏移量由本指令后的1字节指定。 |
JMPIFNOT_L
| 指令 | JMPIFNOT_L |
|---|---|
| 字节码 | 0x27 |
| 系统费 | 2 Datoshi |
| 功能 | 当计算栈栈顶元素为false、0或者null时,跳转到指定偏移位置,偏移量由本指令后的4字节指定。 |
JMPEQ
| 指令 | JMPEQ |
|---|---|
| 字节码 | 0x28 |
| 系统费 | 2 Datoshi |
| 功能 | 当栈顶两个元素相等时,跳转到指定偏移位置,偏移量由本指令后的1字节指定。 |
JMPEQ_L
| 指令 | JMPEQ_L |
|---|---|
| 字节码 | 0x29 |
| 系统费 | 2 Datoshi |
| 功能 | 当栈顶两个元素相等时,跳转到指定偏移位置,偏移量由本指令后的4字节指定。 |
JMPNE
| 指令 | JMPNE |
|---|---|
| 字节码 | 0x2A |
| 系统费 | 2 Datoshi |
| 功能 | 当栈顶两个元素不相等时,跳转到指定偏移位置,偏移量由本指令后的1字节指定。 |
JMPNE_L
| 指令 | JMPNE_L |
|---|---|
| 字节码 | 0x2B |
| 系统费 | 2 Datoshi |
| 功能 | 当栈顶两个元素不相等时,跳转到指定偏移位置,偏移量由本指令后的4字节指定。 |
JMPGT
| 指令 | JMPGT |
|---|---|
| 字节码 | 0x2C |
| 系统费 | 2 Datoshi |
| 功能 | 当计算栈栈顶第一个元素大于第二个元素时,跳转到指定偏移位置,偏移量由本指令后的1字节指定。 |
JMPGT_L
| 指令 | JMPGT_L |
|---|---|
| 字节码 | 0x2D |
| 系统费 | 2 Datoshi |
| 功能 | 当计算栈栈顶第一个元素大于第二个元素时,跳转到指定偏移位置,偏移量由本指令后的4字节指定。 |
JMPGE
| 指令 | JMPGE |
|---|---|
| 字节码 | 0x2E |
| 系统费 | 2 Datoshi |
| 功能 | 当计算栈栈顶第一个元素大于或者等于第二个元素时,跳转到指定偏移位置,偏移量由本指令后的1字节指定。 |
JMPGE_L
| 指令 | JMPGE_L |
|---|---|
| 字节码 | 0x2F |
| 系统费 | 2 Datoshi |
| 功能 | 当计算栈栈顶第一个元素大于或者等于第二个元素时,跳转到指定偏移位置,偏移量由本指令后的4字节指定。 |
JMPLT
| 指令 | JMPLT |
|---|---|
| 字节码 | 0x30 |
| 系统费 | 2 Datoshi |
| 功能 | 当计算栈栈顶第一个元素小于第二个元素时,跳转到指定偏移位置,偏移量由本指令后的1字节指定。 |
JMPLT_L
| 指令 | JMPLT_L |
|---|---|
| 字节码 | 0x31 |
| 系统费 | 2 Datoshi |
| 功能 | 当计算栈栈顶第一个元素小于第二个元素时,跳转到指定偏移位置,偏移量由本指令后的4字节指定。 |
JMPLE
| 指令 | JMPLE |
|---|---|
| 字节码 | 0x32 |
| 系统费 | 2 Datoshi |
| 功能 | 当计算栈栈顶第一个元素小于或者等于第二个元素时,跳转到指定偏移位置,偏移量由本指令后的1字节指定。 |
JMPLE_L
| 指令 | JMPLE_L |
|---|---|
| 字节码 | 0x33 |
| 系统费 | 2 Datoshi |
| 功能 | 当计算栈栈顶第一个元素小于或者等于第二个元素时,跳转到指定偏移位置,偏移量由本指令后的4字节指定。 |
CALL
| 指令 | CALL |
|---|---|
| 字节码 | 0x34 |
| 系统费 | 512 Datoshi |
| 功能 | 调用指定偏移位置的函数,偏移量由本指令后的1字节指定。 |
CALL_L
| 指令 | CALL_L |
|---|---|
| 字节码 | 0x35 |
| 系统费 | 512 Datoshi |
| 功能 | 调用指定偏移位置的函数,偏移量由本指令后的4字节指定。 |
CALLA
| 指令 | CALLA |
|---|---|
| 字节码 | 0x36 |
| 系统费 | 512 Datoshi |
| 功能 | 从计算栈栈顶取出函数地址,并调用该函数。 |
CALLT
| 指令 | CALLT |
|---|---|
| 字节码 | 0x37 |
| 系统费 | 32768 Datoshi |
| 功能 | 从计算栈栈顶取出函数Token,并调用该函数。 |
ABORT
| 指令 | ABORT |
|---|---|
| 字节码 | 0x38 |
| 系统费 | 0 GAS |
| 功能 | 将虚拟机状态立即置为FAULT,且异常不能被捕获。 |
ASSERT
| 指令 | ASSERT |
|---|---|
| 字节码 | 0x39 |
| 系统费 | 1 Datoshi |
| 功能 | 从计算栈栈顶取出元素,若该值为False,则退出虚拟机执行,并将虚拟机状态置为FAULT。 |
THROW
| 指令 | THROW |
|---|---|
| 字节码 | 0x3A |
| 系统费 | 512 Datoshi |
| 功能 | 抛出栈顶的异常。 |
TRY
| 指令 | TRY |
|---|---|
| 字节码 | 0x3B |
| 系统费 | 4 Datoshi |
| 功能 | 进入Try语句块,Catch和Finally地址偏移量分别由本指令后的1字节指定。 |
TRY_L
| 指令 | TRY_L |
|---|---|
| 字节码 | 0x3C |
| 系统费 | 4 Datoshi |
| 功能 | 进入Try语句块,Catch和Finally地址偏移量分别由本指令后的4字节指定。 |
ENDTRY
| 指令 | ENDTRY |
|---|---|
| 字节码 | 0x3D |
| 系统费 | 4 Datoshi |
| 功能 | 结束Try块,然后无条件地将控制转移到特定的目标指令,目标地址偏移量由本指令后的1字节指定。 |
ENDTRY_L
| 指令 | ENDTRY_L |
|---|---|
| 字节码 | 0x3E |
| 系统费 | 4 Datoshi |
| 功能 | 结束Try块,然后无条件地将控制转移到特定的目标指令,目标地址偏移量由本指令后的4字节指定。 |
ENDFINALLY
| 指令 | ENDFINALLY |
|---|---|
| 字节码 | 0x3F |
| 系统费 | 4 Datoshi |
| 功能 | 结束Finally块,如果没有异常发生或捕获,则跳转到目标指令ENDTRY/ENDTRY_L,否则将向上层重新抛出异常。 |
RET
| 指令 | RET |
|---|---|
| 字节码 | 0x40 |
| 系统费 | 0 GAS |
| 功能 | 从当前方法中返回。 |
SYSCALL
| 指令 | SYSCALL |
|---|---|
| 字节码 | 0x41 |
| 系统费 | 0 GAS |
| 功能 | 调用互操作服务。 |
栈操作
实现对栈的元素做复制、移除、交换等功能。
DEPTH
| 指令 | DEPTH |
|---|---|
| 字节码 | 0x43 |
| 系统费 | 2 Datoshi |
| 功能 | 将栈元素个数压入计算栈。 |
DROP
| 指令 | DROP |
|---|---|
| 字节码 | 0x45 |
| 系统费 | 2 Datoshi |
| 功能 | 移除计算栈栈顶的元素。 |
NIP
| 指令 | NIP |
|---|---|
| 字节码 | 0x46 |
| 系统费 | 2 Datoshi |
| 功能 | 移除计算栈栈顶的第二个元素。 |
XDROP
| 指令 | XDROP |
|---|---|
| 字节码 | 0x48 |
| 系统费 | 16 Datoshi |
| 功能 | 从计算栈栈顶获取到整数n, 移除计算栈剩余元素中索引为n的元素。 |
CLEAR
| 指令 | CLEAR |
|---|---|
| 字节码 | 0x49 |
| 系统费: | 16 Datoshi |
| 功能 | 清空计算栈。 |
DUP
| 指令 | DUP |
|---|---|
| 字节码 | 0x4A |
| 系统费 | 2 Datoshi |
| 功能 | 复制计算栈栈顶的元素到栈顶。 |
OVER
| 指令 | OVER |
|---|---|
| 字节码 | 0x4B |
| 系统费 | 2 Datoshi |
| 功能 | 复制计算栈的第二个元素到栈顶。 |
PICK
| 指令 | PICK |
|---|---|
| 字节码 | 0x4D |
| 系统费 | 2 Datoshi |
| 功能 | 从计算栈栈顶获取到整数n,并将计算栈剩余元素中索引为n的元素复制到栈顶。 |
TUCK
| 指令 | TUCK |
|---|---|
| 字节码 | 0x4E |
| 系统费 | 2 Datoshi |
| 功能 | 复制计算栈栈顶的元素到计算栈索引为2的位置。 |
SWAP
| 指令 | SWAP |
|---|---|
| 字节码 | 0x50 |
| 系统费 | 2 Datoshi |
| 功能 | 交换计算栈栈顶两个元素的位置。 |
ROT
| 指令 | ROT |
|---|---|
| 字节码 | 0x51 |
| 系统费 | 2 Datoshi |
| 功能 | 移动计算栈索引为2的元素到栈顶。 |
ROLL
| 指令 | ROLL |
|---|---|
| 字节码 | 0x52 |
| 系统费 | 16 Datoshi |
| 功能 | 从计算栈栈顶获取到整数n,并将计算栈剩余元素中索引为n的元素移动到栈顶。 |
REVERSE3
| 指令 | REVERSE3 |
|---|---|
| 字节码 | 0x53 |
| 系统费 | 2 Datoshi |
| 功能 | 反转计算栈栈顶前三个元素的顺序。 |
REVERSE4
| 指令 | REVERSE4 |
|---|---|
| 字节码 | 0x54 |
| 系统费 | 2 Datoshi |
| 功能 | 反转计算栈栈顶前四个元素的顺序。 |
REVERSEN
| 指令 | REVERSEN |
|---|---|
| 字节码 | 0x55 |
| 系统费 | 16 Datoshi |
| 功能 | 从计算栈栈顶获取到整数n,并反转计算栈剩余元素中前n个元素的顺序。 |
槽操作
INITSSLOT
| 指令 | INITSSLOT |
|---|---|
| 字节码 | 0x56 |
| 系统费 | 16 Datoshi |
| 功能 | 初始化当前执行上下文的静态字段列表。 |
INITSLOT
| 指令 | INITSLOT |
|---|---|
| 字节码 | 0x57 |
| 系统费 | 64 Datoshi |
| 功能 | 初始化当前执行上下文的参数槽和局部变量列表。 |
LDSFLDN
| 指令 | LDSFLD0~LDSFLD6 |
|---|---|
| 字节码 | 0x58~0x5E |
| 系统费 | 2 Datoshi |
| 功能 | 将指定索引处的静态字段压入计算栈,索引值为0~6。 |
LDSFLD
| 指令 | LDSFLD |
|---|---|
| 字节码 | 0x5F |
| 系统费 | 2 Datoshi |
| 功能 | 将指定索引处的静态字段压入计算栈。索引表示为1字节的无符号整数。 |
STSFLDN
| 指令 | STSFLD0~STSFLD6 |
|---|---|
| 字节码 | 0x60~0x0x66 |
| 系统费 | 2 Datoshi |
| 功能 | 将计算栈栈顶元素存入静态列表的指定索引处,索引值为0~6。 |
STSFLD
| 指令 | STSFLD |
|---|---|
| 字节码 | 0x67 |
| 系统费 | 2 Datoshi |
| 功能 | 将计算栈栈顶元素存入静态列表的指定索引处。索引表示为1字节的无符号整数。 |
LDLOCN
| 指令 | LDLOC0~LDLOC6 |
|---|---|
| 字节码 | 0x68~0x6E |
| 系统费 | 2 Datoshi |
| 功能 | 将指定索引处的局部变量压入计算栈,索引值为0~6。 |
LDLOC
| 指令 | LDLOC |
|---|---|
| 字节码 | 0x6F |
| 系统费 | 2 Datoshi |
| 功能 | 将指定索引处的局部变量压入计算栈。索引表示为1字节的无符号整数。 |
STLOCN
| 指令 | STLOC0~STLOC6 |
|---|---|
| 字节码 | 0x70~0x76 |
| 系统费 | 2 Datoshi |
| 功能 | 将计算栈栈顶元素存入局部变量表的指定索引处,索引值为0~6。 |
STLOC
| 指令 | STLOC |
|---|---|
| 字节码 | 0x77 |
| 系统费 | 2 Datoshi |
| 功能 | 将计算栈栈顶元素存入局部变量表的指定索引处。索引表示为1字节的无符号整数。 |
LDARGN
| 指令 | LDARG0~LDARG6 |
|---|---|
| 字节码 | 0x78~0x7E |
| 系统费 | 2 Datoshi |
| 功能 | 将指定索引处的参数压入计算栈,索引值为0~6。 |
LDARG
| 指令 | LDARG |
|---|---|
| 字节码 | 0x7F |
| 系统费 | 2 Datoshi |
| 功能 | 将指定索引处的参数压入计算栈。索引表示为1字节的无符号整数。 |
STARGN
| 指令 | STARG0~STARG6 |
|---|---|
| 字节码 | 0x80~0x86 |
| 系统费 | 2 Datoshi |
| 功能 | 将计算栈栈顶元素存入参数槽的指定索引处,索引值为0~6。 |
STARG
| 指令 | STARG |
|---|---|
| 字节码 | 0x87 |
| 系统费 | 2 Datoshi |
| 功能 | 将计算栈栈顶元素存入参数槽的指定索引处。索引表示为1字节的无符号整数。 |
字符串操作
NEWBUFFER
| 指令 | NEWBUFFER |
|---|---|
| 字节码 | 0x88 |
| 系统费 | 256 GAS |
| 功能 | 创建缓冲区 |
MEMCPY
| 指令 | MEMCPY |
|---|---|
| 字节码 | 0x89 |
| 系统费 | 2048 GAS |
| 功能 | 内存复制 |
CAT
| 指令 | CAT |
|---|---|
| 字节码 | 0x8B |
| 系统费 | 2048 GAS |
| 功能 | 拼接两个字符串 |
SUBSTR
| 指令 | SUBSTR |
|---|---|
| 字节码 | 0x8C |
| 系统费 | 2048 GAS |
| 功能 | 获取子字符串。 |
LEFT
| 指令 | LEFT |
|---|---|
| 字节码 | 0x8D |
| 系统费 | 2048 GAS |
| 功能 | 获取字符串中指定位置左边的字符串。 |
RIGHT
| 指令 | RIGHT |
|---|---|
| 字节码 | 0x8E |
| 系统费 | 2048 GAS |
| 功能 | 获取字符串中指定位置右边的字符串。 |
逻辑运算
INVERT
| 指令 | INVERT |
|---|---|
| 字节码 | 0x90 |
| 系统费 | 4 Datoshi |
| 功能 | 对计算栈栈顶的元素按位取反。 |
AND
| 指令 | AND |
|---|---|
| 字节码 | 0x91 |
| 系统费 | 8 Datoshi |
| 功能 | 对计算栈栈顶的两个元素执行按位与运算。 |
OR
| 指令 | OR |
|---|---|
| 字节码 | 0x92 |
| 系统费 | 8 Datoshi |
| 功能 | 对计算栈栈顶的两个元素执行按位或运算。 |
XOR
| 指令 | XOR |
|---|---|
| 字节码 | 0x93 |
| 系统费 | 8 Datoshi |
| 功能 | 对计算栈栈顶的两个元素执行按位异或运算。 |
EQUAL
| 指令 | EQUAL |
|---|---|
| 字节码 | 0x97 |
| 系统费 | 32 Datoshi |
| 功能 | 判断计算栈栈顶的两个元素是否相等。若相等,则返回1,否则返回0。 |
NOTEQUAL
| 指令 | NOTEQUAL |
|---|---|
| 字节码 | 0x98 |
| 系统费 | 32 Datoshi |
| 功能 | 判断计算栈栈顶的两个元素是否不相等。若不相等,则返回1,否则返回0。 |
算术运算
SIGN
| 指令 | SIGN |
|---|---|
| 字节码 | 0x99 |
| 系统费 | 4 Datoshi |
| 功能 | 获取计算栈栈顶的BigInteger的符号(负、正或零)。 |
ABS
| 指令 | ABS |
|---|---|
| 字节码 | 0x9A |
| 系统费 | 4 Datoshi |
| 功能 | 求计算栈栈顶的BigInteger的绝对值。 |
NEGATE
| 指令 | NEGATE |
|---|---|
| 字节码 | 0x9B |
| 系统费 | 4 Datoshi |
| 功能 | 求计算栈栈顶的BigInteger的相反数。 |
INC
| 指令 | INC |
|---|---|
| 字节码 | 0x9C |
| 系统费 | 4 Datoshi |
| 功能 | 将计算栈栈顶的BigInteger加1。 |
DEC
| 指令 | DEC |
|---|---|
| 字节码 | 0x9D |
| 系统费 | 4 Datoshi |
| 功能 | 将计算栈栈顶的BigInteger减1。 |
ADD
| 指令 | ADD |
|---|---|
| 字节码 | 0x9E |
| 系统费 | 8 Datoshi |
| 功能 | 对计算栈栈顶的两个BigInteger执行加法运算。 |
SUB
| 指令 | SUB |
|---|---|
| 字节码 | 0x9F |
| 系统费 | 8 Datoshi |
| 功能 | 用计算栈第二个BigInteger减去第一个BigInteger。 |
MUL
| 指令 | MUL |
|---|---|
| 字节码 | 0xA0 |
| 系统费 | 8 Datoshi |
| 功能 | 对计算栈栈顶的两个BigInteger执行乘法运算。 |
DIV
| 指令 | DIV |
|---|---|
| 字节码 | 0xA1 |
| 系统费 | 8 Datoshi |
| 功能 | 用计算栈第二个BigInteger除以第一个BigInteger。 |
MOD
| 指令 | MOD |
|---|---|
| 字节码 | 0xA2 |
| 系统费 | 8 Datoshi |
| 功能 | 用计算栈第二个BigInteger除以第一个BigInteger取余。 |
POW
| 指令 | POW |
|---|---|
| 字节码 | 0xA3 |
| 系统费 | 64 Datoshi |
| 功能 | 用计算栈第二个BigInteger为底数,第一个integer为指数,求乘方。 |
SQRT
| 指令 | SQRT |
|---|---|
| 字节码 | 0xA4 |
| 系统费 | 64 Datoshi |
| 功能 | 求计算栈第一个非负BigInteger的开方,并向下取整为BigInteger。 |
SHL
| 指令 | SHL |
|---|---|
| 字节码 | 0xA8 |
| 系统费 | 8 Datoshi |
| 功能 | 从计算栈栈顶获取到整数n,并对剩余计算栈栈顶的BigInteger执行左移n位运算。 |
SHR
| 指令 | SHR |
|---|---|
| 字节码 | 0xA9 |
| 系统费 | 8 Datoshi |
| 功能 | 从计算栈栈顶获取到整数n,并对剩余计算栈栈顶的BigInteger执行右移n位运算。 |
NOT
| 指令 | NOT |
|---|---|
| 字节码 | 0xAA |
| 系统费 | 4 Datoshi |
| 功能 | 对计算栈栈顶的元素执行逻辑非运算。 |
BOOLAND
| 指令 | BOOLAND |
|---|---|
| 字节码 | 0xAB |
| 系统费 | 8 Datoshi |
| 功能 | 对计算栈栈顶的两个元素执行逻辑与运算。 |
BOOLOR
| 指令 | BOOLOR |
|---|---|
| 字节码 | 0xAC |
| 系统费 | 8 Datoshi |
| 功能 | 对计算栈栈顶的两个元素执行逻辑或运算。 |
NZ
| 指令 | NZ |
|---|---|
| 字节码 | 0xB1 |
| 系统费 | 4 Datoshi |
| 功能 | 判断计算栈栈顶的BigInteger是否为非0值。 |
NUMEQUAL
| 指令 | NUMEQUAL |
|---|---|
| 字节码 | 0xB3 |
| 系统费 | 8 Datoshi |
| 功能 | 判断计算栈栈顶的两个BigInteger是否相等。 |
NUMNOTEQUAL
| 指令 | NUMNOTEQUAL |
|---|---|
| 字节码 | 0xB4 |
| 系统费 | 8 Datoshi |
| 功能 | 判断计算栈栈顶的两个BigInteger是否不相等。 |
LT
| 指令 | LT |
|---|---|
| 字节码 | 0xB5 |
| 系统费 | 8 Datoshi |
| 功能 | 判断计算栈第二个BigInteger是否小于第一个BigInteger。 |
LE
| 指令 | LE |
|---|---|
| 字节码 | 0xB6 |
| 系统费 | 8 Datoshi |
| 功能 | 判断计算栈第二个BigInteger是否小于等于第一个BigInteger。 |
GT
| 指令 | GT |
|---|---|
| 字节码 | 0xB7 |
| 系统费 | 8 Datoshi |
| 功能 | 判断计算栈第二个BigInteger是否大于第一个BigInteger。 |
GE
| 指令 | GE |
|---|---|
| 字节码 | 0xB8 |
| 系统费 | 8 GAS |
| 功能 | 判断计算栈第二个BigInteger是否大于等于第一个BigInteger。 |
MIN
| 指令 | MIN |
|---|---|
| 字节码 | 0xB9 |
| 系统费 | 8 GAS |
| 功能 | 获取计算栈栈顶的两个BigInteger中的最小值。 |
MAX
| 指令 | MAX |
|---|---|
| 字节码 | 0xBA |
| 系统费 | 8 GAS |
| 功能 | 获取计算栈栈顶的两个BigInteger中的最大值。 |
WITHIN
| 指令 | WITHIN |
|---|---|
| 字节码 | 0xBB |
| 系统费 | 8 GAS |
| 功能 | 判断计算栈中的第三个BigInteger是否大于等于第二个BigInteger且小于第一个BigInteger。 |
高级数据结构
实现对Array、Map、Struct等的常用操作。
PACKMAP
| 指令 | PACKMAP |
|---|---|
| 字节码 | 0xBE |
| 系统费 | 2048 GAS |
| 功能 | 将计算栈栈顶的2n个元素打包成Map。第1个为key,第2个为第1个的value。 |
PACKSTRUCT
| 指令 | PACKSTRUCT |
|---|---|
| 字节码 | 0xBF |
| 系统费 | 2048 GAS |
| 功能 | 将计算栈栈顶的n个元素打包成结构体。 |
PACK
| 指令 | PACK |
|---|---|
| 字节码 | 0xC0 |
| 系统费 | 2048 GAS |
| 功能 | 将计算栈栈顶的n个元素打包成数组。 |
UNPACK
| 指令 | UNPACK |
|---|---|
| 字节码 | 0xC1 |
| 系统费 | 2048 GAS |
| 功能 | 将计算栈栈顶的数组拆包成元素序列。 |
NEWARRAY0
| 指令 | NEWARRAY0 |
|---|---|
| 字节码 | 0xC2 |
| 系统费 | 16 Datoshi |
| 功能 | 向计算栈栈顶压入一个空数组。 |
NEWARRAY
| 指令 | NEWARRAY |
|---|---|
| 字节码 | 0xC3 |
| 系统费 | 512 Datoshi |
| 功能 | 向计算栈栈顶压入一个大小为n的数组。 |
NEWARRAY_T
| 指令 | NEWARRAY_T |
|---|---|
| 字节码 | 0xC4 |
| 系统费 | 512 Datoshi |
| 功能 | 向计算栈栈顶压入一个元素类型为T且大小为n的数组。 |
NEWSTRUCT0
| 指令 | NEWSTRUCT0 |
|---|---|
| 字节码 | 0xC5 |
| 系统费 | 16 Datoshi |
| 功能 | 向计算栈栈顶压入一个空的结构体。 |
NEWSTRUCT
| 指令 | NEWSTRUCT |
|---|---|
| 字节码 | 0xC6 |
| 系统费 | 512 Datoshi |
| 功能 | 向计算栈栈顶压入一个元素全为0且大小为n的结构体。 |
NEWMAP
| 指令 | NEWMAP |
|---|---|
| 字节码 | 0xC8 |
| 系统费 | 8 Datoshi |
| 功能 | 向计算栈栈顶压入一个空的Map。 |
SIZE
| 指令 | SIZE |
|---|---|
| 字节码 | 0xCA |
| 系统费 | 4 Datoshi |
| 功能 | 获取计算栈栈顶元素的大小。 |
HASKEY
| 指令 | HASKEY |
|---|---|
| 字节码 | 0xCB |
| 系统费 | 64 Datoshi |
| 功能 | 从计算栈栈顶获取索引n(或键)和数组(Map,Buffer,ByteString)。若n在数组(Map,Buffer,ByteString)的长度范围内,则向栈顶压入True,否则压入False。 |
KEYS
| 指令 | KEYS |
|---|---|
| 字节码 | 0xCC |
| 系统费 | 16 Datoshi |
| 功能 | 获取计算栈栈顶的Map的所有Key,以所有Key构造新的Array并压入栈顶。 |
VALUES
| 指令 | VALUES |
|---|---|
| 字节码 | 0xCD |
| 系统费 | 8192 Datoshi |
| 功能 | 获取计算栈栈顶的元素(Array或Map)的所有Value,以所有Value构造新的Array并压入栈顶. |
PICKITEM
| 指令 | PICKITEM |
|---|---|
| 字节码 | 0xCE |
| 系统费 | 64 Datoshi |
| 功能 | 获取计算栈栈顶的数组中的第n个元素。 |
APPEND
| 指令 | APPEND |
|---|---|
| 字节码 | 0xCF |
| 系统费 | 8192 Datoshi |
| 功能 | 向计算栈栈顶的Array中添加一个新项。 |
SETITEM
| 指令 | SETITEM |
|---|---|
| 字节码 | 0xD0 |
| 系统费 | 8192 Datoshi |
| 功能 | 对计算栈栈顶的元素(Array,Map或Buffer)中的指定索引(或key)元素赋值。 |
REVERSEITEMS
| 指令 | REVERSEITEMS |
|---|---|
| 字节码 | 0xD1 |
| 系统费 | 8192 Datoshi |
| 功能 | 反转计算栈栈顶Array或Buffer中的元素。 |
REMOVE
| 指令 | REMOVE |
|---|---|
| 字节码 | 0xD2 |
| 系统费 | 16 Datoshi |
| 功能 | 从Array或Map中移除指定索引(或key)元素。 |
CLEARITEMS
| 指令 | CLEARITEMS |
|---|---|
| 字节码 | 0xD3 |
| 系统费 | 16 Datoshi |
| 功能 | 清空计算栈栈顶CompoundType类型元素中的所有元素。 |
POPITEM
| 指令 | POPITEM |
|---|---|
| 字节码 | 0xD4 |
| 系统费 | 16 Datoshi |
| 功能 | 弹出栈顶Array数组最后的元素,并压入计算栈栈顶。 |
类型操作
ISNULL
| 指令 | ISNULL |
|---|---|
| 字节码 | 0xD8 |
| 系统费 | 2 Datoshi |
| 功能 | 判断计算栈栈顶元素是否为null |
ISTYPE
| 指令 | ISTYPE |
|---|---|
| 字节码 | 0xD9 |
| 系统费 | 2 Datoshi |
| 功能 | 判断计算栈栈顶元素是否为指定的元素类型。 |
CONVERT
| 指令 | CONVERT |
|---|---|
| 字节码 | 0xDB |
| 系统费 | 2048 GAS |
| 功能 | 将计算栈栈顶元素转化为指定的元素类型。 |